package com.cy.ui;


import com.cy.dao.AccountDao;
import com.cy.service.AccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Component 作用：把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
 * 属性：value：指定 bean 的 id。如果不指定 value 属性，默认 bean 的 id 是当前类的类名。首字母小写。
 * <p>
 * @Controller @Service @Repository
 * 他们三个注解都是针对一个的衍生注解，他们的作用及属性都是一模一样的。
 * 他们只不过是提供了更加明确的语义化。
 * @Controller：一般用于表现层的注解。
 * @Service：一般用于业务层的注解。
 * @Repository：一般用于持久层的注解。 细节：如果注解中有且只有一个属性要赋值时，且名称是 value，value 在赋值是可以不写。
 * <p>
 * @Autowired 作用：自动按照类型注入。当使用注解注入属性时，set 方法可以省略。它只能注入其他 bean 类型。当有多个
 * 类型匹配时，使用要注入的对象变量名称作为 bean 的 id，在 spring 容器查找，找到了也可以注入成功。找不到
 * 就报错。
 * @Qualifier 作用：在自动按照类型注入的基础之上，再按照 Bean 的 id 注入。它在给字段注入时不能独立使用，必须和
 * @Autowire 一起使用；但是给方法参数注入时，可以独立使用。
 * 属性：value：指定 bean 的 id。
 * @Resource 作用：
 * 直接按照 Bean 的 id 注入。它也只能注入其他 bean 类型。
 * 属性：name：指定 bean 的 id。
 * <p>
 * @Value 作用：注入基本数据类型和 String 类型数据的
 * 属性:value：用于指定值
 * <p>
 * @Scope 作用：指定 bean 的作用范围。
 * 属性：value：指定范围的值。
 * 取值：singleton prototype request session globalsession
 * @PostConstruct 作用：用于指定初始化方法。
 * @PreDestroy 作用：用于指定销毁方法。
 * @Author : 残影
 * @Date: 2020-09-12 11:43
 */
public class Client {

    public static void main(String[] args) {
        //1.获取核心容器对象
        ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
        //2.根据id获取对象
        AccountService accountService = (AccountService) ac.getBean("accountService");
        AccountDao accountDao = ac.getBean("accountDao", AccountDao.class);
        accountService.saveAccount();
        System.out.println(accountService);
        System.out.println(accountDao);

    }
}
